﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Entidades;
using LogicaNegocio;

namespace PresentacionEscritorio
{
    public partial class frmFechasImportantes : Form
    {
        private List<FechaImportante> listaFechas;

        public frmFechasImportantes()
        {
            InitializeComponent();
        }

        private void frmFechasImportantes_Load(object sender, EventArgs e)
        {
            listaFechas = new List<FechaImportante>();
            txtFecha.Enabled = false;

            //recordar ocultar chkNoLaborable
            chkNoLaborable.Visible = false;

            //traemos las fechas ya registradas del año corriente (o sea, de este año)
            cargarGrilla();
            chkNoLaborable.Checked = true;

        }

        private void cargarGrilla()
        {
            if (grdFechas.RowCount > 0)
                grdFechas.Rows.Clear();

            GestorFechasImportante gf = new GestorFechasImportante();
            listaFechas = gf.obtenerFechas();

            if (listaFechas.Count > 0)
            {
                for (int i = 0; i < listaFechas.Count; i++)
                {
                    int fila = grdFechas.Rows.Add();
                    grdFechas.Rows[fila].Cells["Fecha"].Value = listaFechas[i].Fecha.ToShortDateString();
                    grdFechas.Rows[fila].Cells["Motivo"].Value = listaFechas[i].Motivo;
                    grdFechas.DefaultCellStyle.BackColor = Color.LightYellow;

                    //ponemos las fechas en negrita
                    calendar.AddBoldedDate(listaFechas[i].Fecha);
                }
            }
        }

        private void calendar_DateChanged(object sender, DateRangeEventArgs e)
        {
            DateTime fechaSeleccionada = calendar.SelectionStart.Date;
            txtFecha.Text = fechaSeleccionada.ToShortDateString();
        }

        //agrego a la grilla y recien con el boton aceptar los guardo en la bd
        private void btnAgregar_Click(object sender, EventArgs e)
        {
            if (validarDatos() && !validarExistencia())
            {
                FechaImportante fechaImportante = new FechaImportante();
                fechaImportante.Fecha = DateTime.Parse(txtFecha.Text);
                fechaImportante.Motivo = txtMotivo.Text;
                fechaImportante.NoLaborable = chkNoLaborable.Checked;
                fechaImportante.EsEliminada = false;
                fechaImportante.EstaEnBD = false;

                listaFechas.Add(fechaImportante);
                agregarFechaAGrilla(fechaImportante);
                calendar.AddBoldedDate(fechaImportante.Fecha);
                calendar.UpdateBoldedDates();

                //limpiamos los campos
                txtFecha.Text = "";
                txtMotivo.Text = "";
            }
        }

        //devuelve true: la fecha ya existe; false: la fecha no ha sido cargada
        private bool validarExistencia()
        {
            DateTime fechaNueva = DateTime.Parse(txtFecha.Text);
            bool res = false;
            for (int i = 0; i < listaFechas.Count; i++)
            {
                if (listaFechas[i].Fecha == fechaNueva)
                {
                    res = true;
                    MessageBox.Show("La fecha ya ha sido cargada", "Información", MessageBoxButtons.OK);
                    break;
                }
            }
            return res;
        }

        private void agregarFechaAGrilla(FechaImportante fechaNueva)
        {
            int nroFila = grdFechas.Rows.Add();
            grdFechas.Rows[nroFila].Cells["Fecha"].Value = fechaNueva.Fecha;
            grdFechas.Rows[nroFila].Cells["Motivo"].Value = fechaNueva.Motivo;
            for (int i = 0; i < grdFechas.ColumnCount; i++)
            {
                grdFechas.Rows[nroFila].Cells[i].Style.BackColor = Color.White;
            }
        }

        private bool validarDatos()
        {
            bool res = true;
            if (string.IsNullOrEmpty(txtMotivo.Text))
            {
                res = false;
                MessageBox.Show("El motivo de la fecha es requerido", "Información", MessageBoxButtons.OK);
            }
            return res;
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            bool res = false;
            if (listaFechas.Count > 0)
            {
                GestorFechasImportante gf = new GestorFechasImportante();
                res = gf.registrarFecha(listaFechas);
            }

            if (res)
            {
                MessageBox.Show("Se han registrado con éxito las fechas importantes", "Información", MessageBoxButtons.OK);
                cargarGrilla();
                calendar.SetDate(DateTime.Now);
            }
            else
                MessageBox.Show("No se ha podido registrar las fechas importantes", "Información", MessageBoxButtons.OK);
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }

        private void grdFechas_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (grdFechas.CurrentRow.Cells[e.ColumnIndex].OwningColumn == grdFechas.Columns["Eliminar"])
            {
                DateTime fechaSeleccionada = DateTime.Parse(grdFechas.CurrentRow.Cells["Fecha"].Value.ToString());
                for (int i = 0; i < listaFechas.Count; i++)
                {
                    if (listaFechas[i].Fecha == fechaSeleccionada)
                    {
                        listaFechas[i].EsEliminada = true;
                        break;
                    }
                }
                calendar.RemoveBoldedDate(fechaSeleccionada);
                grdFechas.Rows.Remove(grdFechas.CurrentRow);

            }
        }
    }
}
